package com.ucode.springboot.starter.fileStorage;

import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import com.ucode.springboot.starter.base.utils.SpringBeanUtil;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;

public class FsClient{
    private static Log log = LogFactory.get();
    private static Map<String, FsClient> clients = new HashMap<>();
    
    private FsProvider fsProvider;
    
    private FsClient(FsProviderType providerType,String clientId){
        String fsProviderBeanName =providerType.name()+"FsProviderMap";
        log.info("fsProviderBeanName===>>>"+fsProviderBeanName);
        Map<String, FsProvider> map = SpringBeanUtil.getBean(fsProviderBeanName, Map.class);
        log.info("FsProviderMap===>>>"+(map == null));
        if(map == null || (fsProvider = map.get(clientId))  == null){
            throw new IllegalArgumentException("file provider name:" + providerType.name()+"-"+clientId + " not support");
        }
    }
    
    public static FsClient getClient(FsProviderType providerType,String clientId){
        String key = providerType.name()+"-"+clientId;
        FsClient fsClient = clients.get(key);
        if(fsClient != null){
            return fsClient;
        }
        synchronized (clients) {
            fsClient = clients.get(key);
            if(fsClient != null)return fsClient;
            
            fsClient = new FsClient(providerType,clientId);
            clients.put(key, fsClient);
        }
        return fsClient;
    }
    

    /**
     * 文件上传
     * @date 2020年6月10日
     * @param file
     * @return
     */
    public UploadResult upload(File file) {
        return fsProvider.upload(new UploadObject(file));
    }
    
    /**
     * 文件上传
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @param file
     * @return
     */
    public UploadResult upload(String fileKey, File file) {
        return fsProvider.upload(new UploadObject(fileKey, file));
    }
    /**
     * 文件上传
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @param file
     * @param catalog 文件目录
     * @return
     */
    public UploadResult upload(String fileKey, File file,String catalog) {
        return fsProvider.upload(new UploadObject(fileKey, file).toCatalog(catalog));
    }
    /**
     * 文件上传
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @param file
     * @return
     */
    public UploadResult upload(String fileKey,byte[] file){
        return fsProvider.upload(new UploadObject(fileKey, file));
    }
    
    /**
     * 文件上传
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @param file
     * @param catalog 文件目录
     * @return
     */
    public UploadResult upload(String fileKey,byte[] file,String catalog){
        return fsProvider.upload(new UploadObject(fileKey, file).toCatalog(catalog));
    }
    /**
     * 文件上传
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @param file
     * @param mimeType 媒体资源类型,参考MimeTypeFileExtensionConvert map key
     * @return
     */
    public UploadResult upload(String fileKey, InputStream file, String mimeType) {
        return fsProvider.upload(new UploadObject(fileKey, file, mimeType));
    }
    
    /**
     * 文件上传
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @param file
     * @param mimeType 媒体资源类型,参考MimeTypeFileExtensionConvert map key
     * @param catalog 文件目录
     * @return
     */
    public UploadResult upload(String fileKey, InputStream file, String mimeType,String catalog) {
        return fsProvider.upload(new UploadObject(fileKey, file, mimeType).toCatalog(catalog));
    }
    
    /**
     * 删除
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @return
     */
    public boolean delete(String fileKey) {
        return fsProvider.delete(fileKey);
    }
    
    /**
     * 获取文件下载地址
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @return
     */
    public String getDownloadUrl(String fileKey) {
        return fsProvider.getDownloadUrl(fileKey);
    }
    
    /**
     * 下载文件到本地
     * @date 2020年6月10日
     * @param fileKey 文件名称
     * @param localDir 本地目录
     * @return
     */
    public String downloadLocal(String fileKey,String localDir){
        return fsProvider.downloadLocal(fileKey,localDir);
    }
    
}
